package grest.model;

import java.util.List;
import java.sql.*;
import javax.swing.JOptionPane;
/**
 *
 * @author Agustín, Santiago, Rodrigo
 */
public class Mesas implements Entidad{
    public static String LIBRE="LI";
    public static String OCUPADA="OC";
    public static String NO_DISP="ND";
    public static Integer SIN_MOV_MESA=0;
    private int nro_mesa;
    private int capacidad;
    private String ubicacion;
    private String estado;
    private boolean changed;
    private Integer idMovMesaActual;
    private boolean prechanged = false;
    
    //Constructores
    public Mesas(){
        this(0,1,Mesas.LIBRE);
    }
    /**
     * Constructor de la clase Mesas que obtiene como parametro un Resultset
     * @param rs
     * @throws SQLException 
     */
    public Mesas(ResultSet rs) throws SQLException {
        // valores para un nuevo objeto Test
        setNroMesa(rs.getInt("nro_mesa"));
        setCapacidad(rs.getInt("capacidad"));
        setUbicacion(rs.getString("ubicacion"));
        setEstado(rs.getString("estado"));
        setChanged(false);
        idMovMesaActual=SIN_MOV_MESA;
    }
    /**
     * Constructor para objetos de tipo Mesa
     * @param nro_mesa
     * @param capacidad
     * @param estado 
     */
    public Mesas(int nro_mesa,int capacidad,String estado){
        this.nro_mesa = nro_mesa;
        this.capacidad = capacidad;
        this.estado = estado;
        this.ubicacion="IN";
        idMovMesaActual=SIN_MOV_MESA;
        this.changed=false;
    }
    /**
     * Constructor para objetos de tipo Mesa
     * @param nro_mesa
     * @param capacidad
     * @param ubicacion
     * @param estado 
     */
     public Mesas(int nro_mesa,int capacidad,String ubicacion,String estado){
        this.nro_mesa = nro_mesa;
        this.capacidad = capacidad;
        this.ubicacion = ubicacion;
        this.estado = estado;
        idMovMesaActual=SIN_MOV_MESA;
        this.changed=false;
    }
    
    ///////Metodos Propios//////////////////
    /**
     * Metodo que obtiene el nro_mesa 
     * @return int
     */
    public int getNroMesa(){
        return nro_mesa;
    }
    /**
     * Metodo que obtiene la capacidad de la mesa
     * @return int
     */
    public int getCapacidad(){
        return capacidad;
    }
    /**
     * Metodo que obtiene la ubicacion de la mesa 
     * @return  String
     */    
    public String getUbicacion(){
        return ubicacion;
    }
    /**
     * Metodo que obtiene el estado de la mesa
     * @return String
     */        
    public String getEstado(){
        return estado;
    }
    /**
     * Establece el numero de mesa
     * @param nro 
     */
    public void setNroMesa(int nro){
        this.nro_mesa = nro;
        setChanged(true);
    }
    /**
     * Establece la capacidad de la mesa
     * @param nro 
     */
    public void setCapacidad(int nro){
        this.capacidad = nro;
        setChanged(true);
    }
    /**
     * Establece la ubicacion de la mesa
     * @param s 
     */   
    public void setUbicacion(String s){
        if (s.equals("IN")||s.equals("EX")){
            this.ubicacion = s;
            setChanged(true);
        }
        else{
            this.ubicacion="IN";
            JOptionPane.showMessageDialog(null, "Ingrese un valor válido (IN,EX)","Error",JOptionPane.WARNING_MESSAGE);
        }
    }
    /**
     * Establece el estado de la mesa
     * @param s 
     */    
    public void setEstado(String s){
        this.estado = s;
        setChanged(true);
    }
    
    //Implementacion Interfase Entidad
        
    @Override
    public boolean isChanged() {
        return changed;
    }
    
    @Override
    public boolean isColumnEditable(int columna){
        switch(columna){
            case 0 : return false;
            case 1 : return true;
            case 2 : return true;
            case 3 : return false;
        }
        return false;
    }
    
    @Override
    public void setChanged(boolean f){
       if(!prechanged) changed = f;
    }
    
    @Override
    public int getColumnCount(){
        return 4;
    }
    
    @Override
    public Class getColumnClass(int c){
        switch(c){
            case 0 : return Integer.class;
            case 1 : return Integer.class;
            case 2 : return String.class;
            case 3 : return String.class;
        }
    return null;
    }
    
    @Override
    public String getColumnTitle(int columna){
        switch(columna){
            case 0 : return "nro_mesa";
            case 1 : return "capacidad";
            case 2 : return "ubicación";
            case 3 : return "estado";
        }
    return null;
    }
    
    @Override
    public Object getColumnValue(List<Entidad> e,int row,int col) {
        switch(col) {
            case 0:
                return ((Mesas) e.get(row)).getNroMesa();
            case 1:
                return ((Mesas) e.get(row)).getCapacidad();
            case 2:
                 return ((Mesas) e.get(row)).getUbicacion();
            case 3:
                 return ((Mesas) e.get(row)).getEstado();
        }
        return null;
    }
    
    @Override
     public void setColumnValue(List<Entidad> e,int row,int col,Object value) {
        switch(col) {
           case 0:
                ((Mesas) e.get(row)).setNroMesa((Integer) value);
                break;
           case 1:
                ((Mesas) e.get(row)).setCapacidad((Integer) value);
                break;
           case 2:
                ((Mesas) e.get(row)).setUbicacion((String) value);
                break;
           case 3:
                ((Mesas) e.get(row)).setEstado((String) value);
                break;
        }
     }
        
    @Override
     public void loadTuplas(List<Entidad> tipoEntidad, ResultSet tuplas) throws SQLException{
         tipoEntidad.add(new Mesas(tuplas));
     }   
    
    @Override
    public String getSelectQuery(){
        return "select * from t_mesas";
    }
     
    @Override
     public String getInsertQuery(){
        return "insert into t_mesas values(" + getNroMesa() + "," + getCapacidad() + ",'"+ getUbicacion() + "','" + getEstado()+"')";
     }
     
    @Override
     public String getUpdateQuery(){
        return "update t_mesas set capacidad = " + getCapacidad() + ", ubicacion = '" + getUbicacion() + "', estado = '" + getEstado() + "' where nro_mesa = " + getNroMesa();
     }
     
    @Override
     public String getDeleteQuery() {
        return "delete from t_mesas where nro_mesa = " + getNroMesa();
    } 
    public Integer getIdMovActual(){
        return idMovMesaActual;
    }
    public void setIdMovActual(Integer id){
        this.idMovMesaActual=id;
    }

    @Override
    public void setPreChanged(boolean mod) {
        prechanged=mod;
    }

    @Override
    public boolean isPreChanged() {
        return prechanged;
    }

    @Override
    public String onPreInsertQuery() {
        return "SELECT GEN_ID( GN_T_MESAS, 1 ) FROM RDB$DATABASE";
    }

    @Override
    public void setID(Object id) {
        this.nro_mesa=(Integer)id;
    }
}
